/**
 * 作者再三强调字符串类型并不简单，以下来自于书本的译文:
 *   字符串是新晋 Rustacean 们通常会被困住的领域，这是由于三方面理由的结合：
 *       Rust 倾向于确保暴露出可能的错误，字符串是比很多程序员所想象的要更为复杂的数据结构，
 *       以及 UTF-8。
 *    所有这些要素结合起来对于来自其他语言背景的程序员就可能显得很困难了。
 * 
 *   总而言之，字符串还是很复杂的。不同的语言选择了不同的向程序员展示其复杂性的方式。
 *   Rust 选择了以准确的方式处理 String 数据作为所有 Rust 程序的默认行为，这意味着程序员们必须更多的思考如何预先处理 UTF-8 数据。
 *   这种权衡取舍相比其他语言更多的暴露出了字符串的复杂性，不过也使你在开发周期后期免于处理涉及非 ASCII 字符的错误。
 * 
 *  本章节主要内容
 *  1.字符串的内部构成
 *  2.字符串定义和初始化
 *  3.访问成员
 *  
 *  核心在于字符串的内部构成
 * 
 *  在大部分的语言中，其实字符串的构成倒是差不多的：内部是数组+方法.
 *  例如java的字符串是内部数组+方法，而且java的字符串是不可变的。
 */
fn main(){
    //String使用utf-8编码字符，所以汉字是3*字符个数，英文是1*字符个数
    let s = "hello world";
    println!("{}的长度={}",s,s.len());
    let cn:String="中华人民共和国".to_string();
    println!("{}的长度={}",cn,cn.len());

    //使用索引的方式访问字符串，可能出现问题
    println!("{}的第一个字符是：{}",s,&s[0..1]);
    println!("{}的第一个字符是：{}",cn,&cn[0..3]);  //这样打印是错误的

    //必须使用 chars() 函数来获取字符串中的字符
    println!("cn的包含了以下几个汉字:");
    for c in cn.chars(){
        println!("{}",c);
    }
}